<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./vue.2.5.1.js"></script>
</head>

<body>
    <div id=app1>
        <children1>
            <span>124</span>
        </children1>
        <br>
        <children2>
            <span>124</span>
        </children2>
        <br>
        <children3>
            <span slot='name1'>124</span>
            <span slot='name2'>444</span>
        </children3>
        <br>
        <children4>
            <span slot='name1'>{{sky}}</span>
            <span slot='name2' @click='act()'>122</span>
        </children4>
        <br>
        <children5>
            <span slot="first">【12345】</span>
            <!--上面这行不会显示-->
        </children5>
    </div>
    <div id='app2'>
        <button @click='toshow()'>点击让子组件显示或隐藏</button>
        <children v-if='abc'></children>
    </div>
    <div id='app3'>
        <button @click='toshow()'>点击让子组件显示</button>
        <children></children>
    </div>
    <script>
        var vm = new Vue({
            el: '#app1',
            data: {
                sky: 'fun'
            },
            methods: {
                act() {
                    console.log("It is the parent's method");
                }
            },
            components: {
                //【1】默认情况下：父组件在子组件内套的内容，是不显示的。
                children1: { //这个无返回值，不会继续派发  
                    template: "<button>为了明确作用范围，所以使用button标签</button>"
                },
                //【2】单个slot：简单来说，只使用这个标签的话，可以将父组件放在子组件的内容，放到想让他显示的地方。
                children2: { //这个无返回值，不会继续派发  
                    template: "<button><slot></slot>为了明确<slot></slot>作用范围，所以使用button标签</button>"
                },
                // 【3】具名slot
                // 将放在子组件里的不同html标签放在不同的位置父组件在要分发的标签里添加 slot=”name名” 属性
                // 子组件在对应分发的位置的slot标签里，添加name=”name名” 属性，然后就会将对应的标签放在对应的位置了。
                children3: { //这个无返回值，不会继续派发  
                    template: "<button><slot name='name1'></slot>为了明确<slot name='name2'></slot>作用范围，所以使用button标签</button>"
                },
                //【4】分发内容的作用域：[这里的两个span是属于父组件作用域的，不是子组件作用域的东西]
                // 被分发的内容的作用域，根据其所在模板决定，例如，以上标签，其在父组件的模板中（虽然其被子组件的children标签所包括，但由于他不在子组件的template属性中，因此不属于子组件），则受父组件所控制。
                children4: { //这个无返回值，不会继续派发  
                    template: "<button><slot name='name1'></slot>为了明确<slot name='name2'></slot>作用范围，所以使用button标签</button>"
                },
                //【5】当没有分发内容时的提示：
                // 假如父组件没有在子组件中放置有标签，或者是父组件在子组件中放置标签，但有slot属性，而子组件中没有该slot属性的标签。
                // 那么，子组件的slot标签，将不会起到任何作用。除非，该slot标签内有内容，那么在无分发内容的时候，会显示该slot标签内的内容。
                children5: { //这个无返回值，不会继续派发  
                    template: "<div><slot name='first'><button>【如果没有内容则显示我1】</button></slot>为了明确作用范围，<slot name='last'><button>【如果没有内容则显示我2】</button></slot>所以使用button标签</div>"
                }
            }
        });
        //【6-1】假如想控制子组件根标签的属性
        // 【1】首先，由于模板标签是属于父组件的，因此，将子组件的指令绑定在模板标签里，是不可以的（因为他归属于父组件）；
        // 【2】假如需要通过父组件控制子组件是否显示（例如v-if或者v-show），那么这个指令显然是属于父组件的（例如放在父组件的data下面）。可以将标签写在子组件的模板上。
        var vm2 = new Vue({
            el: '#app2',
            data: {
                abc: false
            },
            methods: {
                toshow() {
                    this.abc = !this.abc
                }
            },
            components: {
                children: {
                    template: "<div>这里是子组件</div>",
                }
            }
        });
        //【6-2】
        var vm1 = new Vue({
            el: '#app3',
            methods: {
                toshow: function() {
                    this.$children[0].tohidden = true;
                }
            },
            components: {
                children: {
                    template: "<div v-if='tohidden' @click='tohide()'>这里是子组件</div>",
                    data: function() {
                        return {
                            tohidden: true
                        }
                    },
                    methods: {
                        tohide() {
                            this.tohidden = !this.tohidden;
                        }
                    }
                }
            }
        })
    </script>
</body>

</html>